package cn.txm.basic.interceptor;


import cn.txm.basic.constant.Constant;
import cn.txm.basic.util.AjaxResult;
import cn.txm.basic.util.RedisUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 登录拦截
 * 为何一个类实现一个接口后，没有重写任何抽象方法，也不会报错？？？？
 * 因为：查看 handlerIntercepter的接口方法都有default修饰。即使不重写也不会报错的
 * @author Administrator
 * @version 1.0
 * @date 2021/1/14 10:30
 */
@Component
public class LoginInterceptor implements HandlerInterceptor {
    /**
     * 在controller方法之前进行拦截【判断是否已登录】
     * pre：是previous的简写，表示之前
     * @param request   请求
     * @param response  响应
     * @param handler   处理器
     * @return  返回true表示放行，返回false表示已拦截
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.先从请求头中获取userToken
        String userToken = request.getHeader("userToken");

        //2.判断
        if(StringUtils.hasText(userToken)){
            //再以userToken为键，到Redis中登录用户信息
            String loginUserJsonStr = RedisUtils.INSTANCE.get(userToken);
            if(StringUtils.hasText(loginUserJsonStr)){
                //刷新Redis中用户信息的过期时间为30分钟
                RedisUtils.INSTANCE.set(userToken, loginUserJsonStr, Constant.EXPIRE_TIME_IN_REDIS);
                //已登录：则直接放行
                return true;
            }
        }
        //3.未登录时，给出相应提示
        AjaxResult ajaxResult = AjaxResult.me().setSuccess(false).setMessage("noUser");
        /**
         * 下面这一堆代码：就是SpringMVC的@ResponseBody注解的底层实现代码
         */
        //利用jackson工具将对象转化为json字符串
        ObjectMapper objectMapper = new ObjectMapper();
        String jsonStr = objectMapper.writeValueAsString(ajaxResult);
        //利用响应对象的输出流输出这个json字符串
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(jsonStr);
        response.getWriter().flush();
        response.getWriter().close();
        return false;
    }
}
